#include <iostream>
#include <thread>
#include <future>

using namespace std;

/*
    package_task对任务函数进行封装
    通过get_future获取一个future对象，来获取对这个函数的异步执行结果
*/

int Add(int num1, int num2)
{
    this_thread::sleep_for(chrono::seconds(1));
    cout << "Add" << endl;
    return num1 + num2;
}

int main()
{
    // std::packaged_task<int(int,int)>task(Add);
    // std::future<int> fut = task.get_future();
    // std::thread th(task, 11, 22);

    auto ptask = std::make_shared<packaged_task<int(int, int)>>(Add);
    std::future<int> fut = ptask->get_future();
    std::thread th([ptask]()
                   { (*ptask)(11, 22); });

    int sum = fut.get(); // 同步控制(阻塞)：只有prom被设置了结果，get才能获取结果
    cout << "sum:" << sum << endl;

    th.join();
    return 0;
}